home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / COMP / CODEMAIN.ICL < prev    next >
Encoding:
Text File  |  1991-07-06  |  36.6 KB  |  3 lines

  1. ⓪ (* -----------------------------------------------------⓪#Modula Compiler  /3.6a/⓪#-----------------------------------------------------⓪#⓪#Codeerzeugung für Main-Module⓪#⓪$30.3.85  GDOS Version⓪%7.6.85  bessere Code-Erzeugung fuer StatLink-Verfolgung⓪%8.6.85  bessere Code-Erzeugung fuer Load #0 (CLR)⓪$30.7.85  Interrupt-faehiger Code fuer Subrange Check⓪%7.8.85  Interrupt-Level setzen⓪"{ 12.8.85  NEG.W D0  statt AND.W D7,D0 }⓪$15.8.85  RTE auch in ModulBody bei Priority >= 0⓪$27.8.85  wieder AND.W D7,D0 eingefuehrt⓪#17.10.85  OR & AND statt MOVE to SR bei Interrupt-Level-Aenderung;⓪-MOVE (A7)+,SR statt RTE bei Ende einer Interrupt-Routine⓪#22.02.86  Neuordnung der Texte⓪#14.04.86  Put147 implementiert⓪#15.04.86  Put148, Put149 implementiert; Put119 gestrichen⓪#16.04.86  Put150 implementiert⓪#21.04.86  mulu #1 in Put20 verhindert⓪#12.06.86  Aenderung vom 21.4. funktioniert jetzt wirklich⓪#28.07.86  Put151 implementiert⓪#17.10.86  Put200-Put210 fuer Byte-Handling⓪-Kopierschleifen Put211, 212 fuer gerade oder ungerade Laenge;⓪-Arraygroessen ueber 64K Wort moeglich⓪#18.10.86  Put213 fuer ForLoops;⓪-Peephole-Optimierung auf zwei Ebenen erweitert⓪#19.10.86  Peephole-Behandlung in Put73 korrigiert⓪#21.10.86  Put66/67 und Movecut hinterlassen Info ueber MOVE.W/L source,D0;⓪-Put72 kuerzt MOVE src,A0 auch im vorletzten Befehl;⓪-Put20 ruft Put72 auf.⓪#22.10.86  Put209 fuer Byte-Subrangecheck; alle Unsigned-SubrangeChecks⓪-(95, 97, 209) jetzt ohne Vergleich auf Untergrenze Null;⓪-put141 erlaubt Zuweisung von Arrays > 32K;⓪-AND D7,dest durch ANDI.W #1,dest ersetzt in put43/44/134⓪#23.10.86  Put74 erlaubt Long-Wert;⓪-Put214 zur Formatwandlung Char -> String [1]⓪#24.10.86  Put74 und Put210 erzeugen Endmarken 0.W bzw 0.B;⓪-CSP kennt neue Runtime-Prozeduren TRAN, IOTR, NEWP fuer Prozesse⓪#27.10.86  Put73 erzeugt fuer Wort-Offset LEA statt ADDA (kuerzbar)⓪ tt 30.10.86  PutDebug statt Put76⓪$1.11.86  Put214 (Char -> String [1]) erzeugt fuer Atari keinen Code mehr;⓪-alle Put-Routinen fuer Bytes auf nachfolgenden Sync geaendert;⓪-Peephole-Opt. put211 gegen 212 implementiert⓪#25.11.86  in put200.. jeweils SUBQ.L #1,A3 berichtigt (war SUBQ.B);⓪-put218 implementiert und NICHT getestet⓪#30.11.86  Test und Korrektur von put218⓪-put138 erzeugt wieder rechtsbuendige CHARs fuer Gepard-Std.⓪#19.12.86  put219 checkt Zugriff ueber NIL-Pointer; neuer TRAP 7 !⓪#20.12.86  put220 zum Umkopieren von Open Arrays als Value-Parameter;⓪-neue Runtime-Prozedur @COPY dafuer.⓪#16. 1.87  Umstellung A1/A2 -> A5/A5 in Atari-Version⓪#18. 1.87  put221,222 fuer Value-Uebergabe von Open Arrays⓪#29. 1.87  put221 rettet Adr vom Stack, falls Aufruf ueber ProcVar erfolgt.⓪#30. 1.87  put220 umgestellt: erzeugt jetzt Code fuer Uebergabe Open Array⓪.an Open Array by Val; neue RuntimeProc @COPS.⓪#12. 2.87  put212bytes implementiert⓪#15. 2.87  Atari-Version: RangeErr jetzt mit Trap #0,9 statt Trap #0,0.⓪-put221 kopiert Arrays von ungeraden Adressen jetzt mit Hilfsreg.⓪-byteweise auf den A7-Stack; dadurch Umweg ueber (A3) gespart.⓪#16. 2.87  put211bytes implementiert;⓪-put7 kopiert bis zu 16 Byte Parameter ohne Schleife⓪#17. 2.87  put221bytes implementiert          === nicht getestet ===⓪#26. 2.87  put221bytes korrigiert⓪#25. 3.87  Allocate/DeAllocate bei Atari GROSS schreiben⓪#16.04.87  Trap7 bei Gepard mit erweiterem Word !⓪#09.05.87  Atari: TRAP für Errors: #6, für Debug: #5; Errornummern geändert⓪#15.06.87  put117 (Real-Abs) für neues Atari-Realformat⓪#18.06.87  put131 mit nachfolgendem Ergebnis-TST für folgende Rangechecks⓪$2.07.87  put5, put6: MOVEM statt einzelner MOVEs beim Register-Retten,⓪/für Atari Reihenfolge MOVEM und LINK/UNLK vertauscht;⓪-putRET: Atari-Version auch im Module Body mit UNLK.⓪$3.07.87  put203a, put204a: Konvertierung Long <> Byte, unsigned;⓪-put56 benutzt für Stackcheck Var. 'StackReserve'.⓪#14.07.87  put5: A7 wird richtig gesetzt, auch bei lok. Procs;⓪3Optimierung bei Put7 (TT)⓪#21.07.87 TT  UNLK-Erzeugung in Modulbody wieder raus.⓪#22.07.87 TT  STPROC: @LSTN neu⓪#23.07.87 TT  PutRet: Priority-Restore wird zw. Reg-Restore und UNLK⓪0gelegt. Put6a in Put6d und Put6e zerteilt; put146 und⓪0put6c angepaßt für Atari.⓪#03.01.88 TT  PUT6C korrigiert (D3 gerettet)⓪#28.05.88 TT  put56 optimiert; put56b neu: faßt put5 & put56 zusammen und⓪1ruft Runtime-Funktionen zum Link auf; STPROC um '@RES1/2'⓪1erweitert.⓪#07.01.90 TT  put56b übergibt nun Bereich als Long statt Word; put5 kann⓪2auch Long-LINK gen.⓪#28.01.90 TT  PutLinkWOcopy neu: Macht LINK, sodaß Parms auf A3-Stack bleiben⓪#08.02.90 TT  'freeRegs' wird beim Retten/Rückladen der Regs bei Proc-Entry⓪0& -Exit berücksichtigt⓪#-----------------------------------------------------⓪ *)⓪ ⓪ ⓪ (**** Lokal benoetigte Vorwaerts-Referenzen ****)⓪ ⓪ FORWARD putIncA3;⓪ FORWARD Put66;⓪ FORWARD Put33w;⓪ FORWARD put216;⓪ FORWARD SetPriority;⓪ ⓪ (**** Codeerzeugung: ****)⓪ ⓪ PROCEDURE MOVECUT;⓪ BEGIN⓪ ASSEMBLER⓪*TST.L   D7⓪*BMI.L   CLEARCUT      ;letzter Befehl war CLR.x (A3)+⓪*SWAP    D7⓪*ANDI.W  #$FFC0,D0⓪*OR.W    D7,D0⓪*⓪*; einige Befehle koennen voellig entfallen:⓪*⓪*CMPI.W  #$2048,D0     ;MOVE.L A0,A0?⓪*BEQ     MOVECUT1⓪*CMPI.W  #$3000,D0     ;MOVE.W D0,D0?⓪*BEQ     MOVECUT1⓪*CMPI.W  #$2000,D0     ;MOVE.L D0,D0?⓪*BEQ     MOVECUT1⓪*CMPI.W  #$2848,D0     ;MOVE.L A0,A4?⓪*BNE     MOVECUT2⓪*⓪*;move.l a0,a4 verhindern, wenn moeglich⓪*⓪*MOVE.L  D7,-(A7)⓪*MOVE.L  Peephole,D7⓪*CMP.B   #4,D7         ;vorher war move #long -> a0 ?⓪*BEQ     ok⓪*CMP.B   #5,D7         ;vorher lea source,a0 ?⓪*BNE     MoveCut3      ;leider nix zu machen⓪ ok        ADDQ.L  #4,A7⓪*LSR.W   #8,D7         ;Pos. des zu aendernden Opcodes berechnen⓪*ADDQ.W  #2,D7⓪*NEG.W   D7⓪*ORI.W   #$0800,-2(A4,D7.W) ;Dest A0 zu A4 machen⓪@;beachte Offset -2: patchen im vorigen Bef.⓪*CLR.W   D7⓪*BRA     MoveCut4⓪ MoveCut3  MOVE.L  (A7)+,D7      ;Opcode muss doch erzeugt werden⓪*⓪*; ZielAdresse fuer den neuen Code bestimmen⓪*⓪ MoveCut2  SWAP    D7⓪*MOVE.W  D7,-(A7)⓪*LSR.W   #8,D7⓪*ADDQ.W  #2,D7⓪*NEG.W   D7⓪*MOVE.W  D0,0(A4,D7.W)⓪*MOVE.W  (A7)+,D7⓪*CMP.W   #$207C,D0     ;move.l #data,a0 erzeugt?⓪*BEQ     longA0⓪*AND.W   #$0FC0,D0     ;Dest-Feld betrachten⓪*BNE     done⓪*ADDQ.B  #7,D7         ;Data -> EvalStk zu Data -> D0 machen⓪*RTS⓪ longA0    MOVE.L  #$404,D7      ;#ADR->A0 GEGEN (A0) KUERZBAR⓪*RTS⓪ MoveCut1  MOVE.L  Peephole,D7   ;und Info ueber vorigen ausgraben⓪ MoveCut4  SUBQ.L  #2,A4         ;letzten Befehl vergessen⓪*CLR.L   Peephole⓪*RTS⓪*⓪*;wir basteln uns einen CLR-Opcode...⓪ ⓪ !CLEARCUT MOVE.W  D0,-(A7)⓪*AND.W   #0000000111000000%,D0 ;Dest Mode rausfiltern⓪*CMP.W   #0000000001000000%,D0 ;ist das ein AReg direkt?⓪*BEQ     MOVEAD        ;schade: ein MoveAddress⓪*MOVE.W  (A7)+,D0⓪*MOVE.W  #$4200,D7     ;high byte von CLR⓪*LSR.W   #3,D0⓪*MOVE.B  D0,D7         ;mode steht richtig in D7⓪*AND.B   #00111000%,D7 ;Rest wegmaskiert⓪*LSR.W   #1,D0⓪*LSR.B   #5,D0         ;reg steht richtig⓪*OR.B    D0,D7⓪*CLR.B   D0⓪*LSR.W   #2,D0         ;len steht richtig⓪*OR.B    D0,D7⓪*BTST    #6,D7⓪*BEQ     clear1        ;ist CLR.L⓪*BCLR    #7,D7         ;CLR.W geschickterweise anders codiert!⓪ !clear1   MOVE.W  D7,-2(A4)⓪*BRA     done⓪ !movead   MOVE.W  (A7)+,(A4)+  ;nix zu kuerzen bei MOVEA⓪*MOVE.L  D7,PeepHole   ;normale Erzeugung eines neuen Befehls⓪ !done     CLR.W   D7            ;bei einfacher Kuerzung: Peephole haelt Wert⓪ END⓪ END MOVECUT;⓪ ⓪ (*      Schade: Hier wuerden MOVEs mit Source- und DestAdr entstehen,⓪0wobei einer der Operanden verschoben werden muss -⓪0wegen des moeglichen Eintrags in die RelozierListe leider⓪0verboten! Insbes. muessten Source-Operanden VOR die⓪0Zieladresse gebastelt werden!⓪0⓪ PROCEDURE AssignCut;⓪ ⓪ (* Prueft vor "MOVE.x source,(A4)", ob vorher LEA source2,A4 oder⓪#MOVE.L #data,A4 steht; wenn moeglich wird direkte Zuweisung erzeugt.⓪#⓪#D0 = zu erzeugender Opcode⓪!*)⓪ ⓪ BEGIN ASSEMBLER⓪(CMP.B   #7,D7           ;LEA nach A4 ?⓪(BEQ     wasLEA⓪(CMP.B   #8,D7           ;MOVE #data,A4?⓪(BEQ     wasMOVE⓪(MOVE.W  D0,(A4)+⓪(CLR.W   D7⓪(RTS⓪ wasLEA  AND.W   #$F03F,D0       ;Destination EA ausblenden⓪(MOVE.W  D7,-(A7)        ;merken wegen Offset-Info⓪(LSR.L   #3,D7           ;Reg und Mode der SourceAdr trennen⓪(AND.L   #$0007E000,D7   ;alles ausser Reg/ModeFeld loeschen⓪(LSR.W   #7,D7           ;Reg an richtiger Position⓪(OR.W    D7,D0⓪(SWAP    D7⓪(LSL.W   #6,D7           ;Mode an richtiger Position⓪(OR.W    D7,D0⓪(MOVE.W  (A7)+,D7⓪(BRA     putOp⓪ wasMOVE AND.W   #$F03F,D0       ;Destination EA ausblenden⓪(OR.W    #$0E40,D0       ;"Absolute long" einsetzen⓪ putOp   LSR.W   #8,D7           ;ZielAdr fuer Patch berechnen⓪(ADDQ.W  #2,D7⓪(NEG.W   D7⓪(MOVE.W  D0,0(A4,D7.W)   ;und neuen Op eintragen⓪(CLR.W   D7⓪&END⓪ END AssignCut;⓪ *)⓪ ⓪ PROCEDURE pushRegs;⓪"BEGIN⓪$ASSEMBLER⓪)(*$C+*)⓪)MOVE.L  MM2Comp2.freeVarRegs,D0⓪)BSET    #MM2Comp2.A5,D0  ; das wurde schon gerettet durch LINK⓪)MOVE.L  D0,MM2Comp2.freeVarRegs⓪)JSR     MM2Comp2.saveVarRegs⓪)(*$C=*)⓪$END⓪"END pushRegs;⓪ ⓪ PROCEDURE popRegs;⓪"BEGIN⓪$ASSEMBLER⓪)(*$C+*)⓪)JSR     MM2Comp2.restoreVarRegs⓪)(*$C=*)⓪$END⓪"END popRegs;⓪ ⓪ PROCEDURE Put6e;        (* UNLINK am Prozedurende *)⓪ BEGIN⓪ ASSEMBLER⓪ (*$ ? Gepard: MOVE.W  #$4E59,(A4)+     ;unlk a1  *)⓪ ⓪ (*$ ? Atari:  MOVE.W  #$4E5D,(A4)+     ;unlk a5  *)⓪.CLR.W   D7⓪ END⓪ END Put6e;⓪ ⓪ PROCEDURE Put6d;        (* Register-Restore am Prozedurende *)⓪ BEGIN⓪ ASSEMBLER⓪ (*$ ? Gepard: MOVE.L  #$4CDF1400,(A4)+ ;movem.l (a7)+,a2/a4   *)⓪ ⓪ (*$ ? Atari:  JSR     popRegs    *)⓪.CLR.W   D7⓪ END⓪ END Put6d;⓪ ⓪ PROCEDURE Put6B;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W  #$4E75,(A4)+  ;RTS⓪)CLR.W   D7⓪ END⓪ END Put6B;⓪ ⓪ PROCEDURE Put6c;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪)MOVE.W  #$46DF,(A4)+  ;MOVE.W (A7)+,SR  *)⓪ (*$ ? Atari:⓪)MOVE.W  #$321F,(A4)+  ;MOVE.W (A7)+,D1⓪)MOVE.L  D3,-(A7)⓪)MOVEQ   #36,D3        ;JSR @PRIO⓪)JSR     csp⓪)MOVE.L  (A7)+,D3                       *)⓪)CLR.W   D7⓪&END⓪ END Put6c;⓪ ⓪ FORWARD BRAToLabelD0;⓪ ⓪ PROCEDURE jmpToRet;⓪"BEGIN⓪$ASSEMBLER⓪)MOVE.L  RetAddr,D0⓪)JMP     BRAToLabelD0⓪$END⓪"END jmpToRet;⓪ ⓪ PROCEDURE PutRET;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L  A4,RetAddr     ;Einsprungadr. f. weitere RETURNs merken⓪)⓪)MOVE.L  D0,-(A7)⓪)MOVE.L  options,D0⓪)BTST    #12,D0        ;L- schaltet auch SR-Rettung ab!⓪)BEQ     doRTS⓪)⓪)TST.W   modflag⓪)BNE     doPrio        ;MODULE BODY⓪ ⓪ (*$ ? Atari: ; Erst MOVEM, dann Priority, dann UNLK:⓪)MOVE.L  VarA3Ofs,D0   ;ggf. A3 abräumen⓪)NEG.L   D0⓪)JSR     putIncA3      ;SUB #<D0>,A3⓪)JSR     put6d         ;gerettete nicht-temp.Regs zurück⓪)TST.W   priority⓪)BMI     noPrio⓪)CMPI.W  #1,GLOBAL     ;lokale PROC:⓪)BNE     noPrio        ; Prio bleibt erhalten⓪)JSR     Put6c         ;MOVE.W (a7)+,sr erzeugen⓪ !noPrio  JSR     Put6e         ;UNLK⓪ *)⓪ ⓪ (*$ ? Gepard: ; Erst UNLK, dann Priority, dann MOVEM:⓪)JSR     put6e         ;UNLK⓪)TST.W   priority⓪)BMI     noPrio⓪)CMPI.W  #1,GLOBAL     ;lokale PROC:⓪)BNE     noPrio        ; Prio bleibt erhalten⓪)JSR     Put6c         ;MOVE.W (a7)+,sr erzeugen⓪ !noPrio  JSR     Put6d         ;MOVEM (A7)+,A2/A4⓪ *)⓪)BRA     doRTS⓪)⓪ doPrio   ; Body:⓪)TST.W   priority⓪)BMI     doRTS⓪)JSR     Put6c         ;MOVE.W (a7)+,sr erzeugen⓪ ⓪ !doRTS   ; Bei $E+ TRAP f. Proc-Namensausgabe erzeugen⓪)MOVEQ   #67,D0        ; markiert Exit der Proc⓪)JSR     TraceProc⓪)⓪)JSR     Put6b         ;RTS⓪ !ready   MOVE.L  (A7)+,D0⓪ END⓪ END PutRET;⓪ ⓪ PROCEDURE Put0;⓪ BEGIN ASSEMBLER⓪)MOVE.W  A4,D0⓪)CLR.W   D7⓪)BTST    #0,D0⓪)BEQ     Put01⓪)CLR.B   (A4)+⓪ put01   RTS⓪ END⓪ END Put0;⓪ ⓪ PROCEDURE Put2;⓪ BEGIN ASSEMBLER⓪)CLR.W   (A4)+⓪)CLR.W   D7⓪&END⓪ END Put2;⓪)⓪ PROCEDURE Put3;⓪ BEGIN ASSEMBLER⓪(CLR.L   (A4)+⓪&END⓪ END Put3;⓪ ⓪ PROCEDURE putIncA3;⓪"BEGIN⓪$ASSEMBLER⓪)TST.L   D0⓪)BEQ.W   incEnd⓪)BMI     doDec⓪)⓪)CMPI.L  #8,D0⓪)BHI     noQuick⓪)⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$508B,D0        ;ADDQ #<D0>,A3⓪)MOVE.W  D0,(A4)+⓪)BRA     incEnd⓪ ⓪ noQuick  CMPI.L  #$7FFE,D0⓪)BHI     noWord⓪)MOVE.W  #$D6FC,(A4)+⓪)MOVE.W  D0,(A4)+         ;ADDA.W #<D0>,A3⓪)BRA     incEnd⓪ ⓪ noWord   MOVE.W  #$D7FC,(A4)+⓪)MOVE.L  D0,(A4)+         ;ADDA.L #<D0>,A3⓪)BRA     incEnd⓪)⓪ doDec    NEG.L   D0⓪)CMPI.L  #8,D0⓪)BHI     noQuickN⓪)⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$518B,D0        ;SUBQ #<D0>,A3⓪)MOVE.W  D0,(A4)+⓪)BRA     incEnd⓪ ⓪ noQuickN CMPI.L  #$7FFE,D0⓪)BHI     noWordN⓪)MOVE.W  #$96FC,(A4)+⓪)MOVE.W  D0,(A4)+         ;SUBA.W #<D0>,A3⓪)BRA     incEnd⓪ ⓪ noWordN  MOVE.W  #$97FC,(A4)+⓪)MOVE.L  D0,(A4)+         ;SUBA.L #<D0>,A3⓪)⓪ incEnd⓪$END⓪"END putIncA3;⓪ ⓪ PROCEDURE putIncA7;⓪"BEGIN⓪$ASSEMBLER⓪)TST.L   D0⓪)BEQ.W   incEnd⓪)BMI     doDec⓪)⓪)CMPI.L  #8,D0⓪)BHI     noQuick⓪)⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$508F,D0        ;ADDQ #<D0>,A7⓪)MOVE.W  D0,(A4)+⓪)BRA     incEnd⓪ ⓪ noQuick  CMPI.L  #$7FFE,D0⓪)BHI     noWord⓪)MOVE.W  #$DEFC,(A4)+⓪)MOVE.W  D0,(A4)+         ;ADDA.W #<D0>,A7⓪)BRA     incEnd⓪ ⓪ noWord   MOVE.W  #$DFFC,(A4)+⓪)MOVE.L  D0,(A4)+         ;ADDA.L #<D0>,A7⓪)BRA     incEnd⓪)⓪ doDec    NEG.L   D0⓪)CMPI.L  #8,D0⓪)BHI     noQuickN⓪)⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$518F,D0        ;SUBQ #<D0>,A7⓪)MOVE.W  D0,(A4)+⓪)BRA     incEnd⓪ ⓪ noQuickN CMPI.L  #$7FFE,D0⓪)BHI     noWordN⓪)MOVE.W  #$9FFC,(A4)+⓪)MOVE.W  D0,(A4)+         ;SUBA.W #<D0>,A7⓪)BRA     incEnd⓪ ⓪ noWordN  MOVE.W  #$9FFC,(A4)+⓪)MOVE.L  D0,(A4)+         ;SUBA.L #<D0>,A7⓪)⓪ incEnd⓪$END⓪"END putIncA7;⓪ ⓪ PROCEDURE PutLinkWOcopy;⓪"BEGIN⓪$ASSEMBLER⓪); LINK    A5,#0⓪); MOVEM.L A6,-(A7)⓪); MOVE.L  A3,A6⓪); MOVE.L  D2,(A3)+   ; falls lok. Proc⓪); ADDI    #<D0>,A3⓪)⓪)MOVE.L  D0,-(A7)⓪)⓪)MOVE.W  #$4E55,(A4)+     ;LINK A5,#..⓪)CLR.W   (A4)+⓪)⓪)CMPI.W  #1,GLOBAL        ;globale Proc:⓪)BNE     Put501⓪)JSR     SetPriority      ; Prio setzen⓪ put501⓪)JSR     pushRegs         ;Reg-Vars und A6 retten⓪)MOVE.W  #$2C4B,(A4)+     ;MOVE.L A3,A6⓪)⓪)CMPI.W  #1,GLOBAL        ;globale Proc:⓪)BEQ     Put502           ; kein STAT.LINK⓪)MOVE.W  #$26C2,(A4)+     ;MOVE.L D2,(A3)+⓪)ADDQ.L  #4,VarA3Ofs⓪ put502⓪)MOVE.L  (A7)+,D0⓪)JSR     putIncA3         ;ADD #<D0>,A3⓪)⓪)CLR.W   D7⓪$END⓪"END PutLinkWOcopy;⓪ ⓪ PROCEDURE putLink;⓪"BEGIN⓪$ASSEMBLER⓪)CMPI.L  #$FFFF8000,D0⓪)BLT     long0⓪); Short-LINK erzeugen⓪)MOVE.W  #$4E55,(A4)+     ;link a5,#..⓪)MOVE.W  D0,(A4)+⓪)RTS⓪ long0    ; Long-LINK erzeugen⓪)MOVE.W  #$2F0D,(A4)+  ;move.l a5,-(a7)⓪)MOVE.W  #$2A4F,(A4)+  ;move.l a7,a5⓪)MOVE.W  #$DFFC,(A4)+  ;adda.l #x,a7⓪)MOVE.L  D0,(A4)+⓪$END⓪"END putLink;⓪ ⓪ PROCEDURE Put5;                 (* LINK am Prozeduranfang *)⓪ BEGIN ASSEMBLER⓪); LINK   A5,#<D0>⓪); MOVE.L D2,-(A7)⓪); MOVE.L A7,A2⓪); MOVEM  A6,-(A7)⓪); MOVE.L A2,A6⓪ ⓪ (*$ ? Gepard:⓪)MOVE.L  #$48E70028,(A4)+ ;movem.l a2/a4,-(a7)⓪)CMPI.W  #1,GLOBAL     ;lokale Proc:⓪)BNE     Put502        ; kein Prio setzen⓪)JSR     SetPriority⓪ put502   MOVE.W  #$4E51,(A4)+     ;link a1,#..⓪)MOVE.W  D0,(A4)+⓪)CMPI.W  #1,GLOBAL     ;globale Proc:⓪)BEQ     Put501        ; kein STAT.LINK⓪)MOVE.W  #$2F02,(A4)+  ;move.l d2,-(a7)⓪ put501   MOVE.W  #$244F,(A4)+  ;move.l a7,a2⓪)CLR.W   D7                             *)⓪)⓪ (*$ ? Atari:⓪)JSR     putLink⓪)CMPI.W  #1,GLOBAL     ;globale Proc:⓪)BEQ     Put501        ; kein STAT.LINK⓪)MOVE.W  #$2F02,(A4)+  ;move.l d2,-(a7)⓪ put501   MOVE.W  #$244F,(A4)+  ;move.l a7,a2⓪)CMPI.W  #1,GLOBAL     ;lokale Proc:⓪)BNE     Put502        ; kein Prio setzen⓪)JSR     SetPriority⓪ put502   JSR     pushRegs      ;Reg-Vars und A6 retten⓪)MOVE.W  #$2C4A,(A4)+  ;move.l a2,a6⓪)CLR.W   D7                             *)⓪&END⓪ END Put5;⓪ ⓪ PROCEDURE Put7;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: TST.W   D1⓪.BNE     put701⓪.MOVE.W  #$2049,(A4)+  ;move.l a1,a0⓪.BRA     put702⓪ put701        MOVE.W  #$41E9,(A4)+  ;lea [d1](a1),a0⓪.MOVE.W  D1,(A4)+                          *)⓪.⓪ (*$ ? Atari:  TST.W   D1⓪.BNE     put701⓪.MOVE.W  #$204D,(A4)+  ;move.l a5,a0⓪.BRA     put702⓪ put701        MOVE.W  #$41ED,(A4)+  ;lea [d1](a5),a0⓪.MOVE.W  D1,(A4)+                          *)⓪.⓪ put702        MOVE.W  D0,D1         ;aus DBF-Count VarSpace zurueckrechnen⓪.ADDQ    #1,D1⓪.LSL.W   #1,D1⓪.CMP.W   #16,D1        ;kurz (ohne Loop kopierbar) ?⓪.BLS     noloop⓪.⓪.JSR     Put33w        ;MOVE.L/MOVEQ #,D0⓪.MOVE.W  #$3123,(A4)+  ;move.w -(a3),-(a0)⓪.MOVE.L  #$51C8FFFC,(A4)+ ;dbf d0,-4⓪.CLR.W   D7⓪.RTS⓪.⓪.; bis zu 16 Bytes mit 4 Moves direkt kopieren⓪ ⓪ mvLong        MOVE.W  #$2123,(a4)+  ;move.l -(a3),-(a0)⓪.SUBQ.W  #4,D1⓪ noloop        CMP.W   #2,D1         ;wieviel noch zu kopieren ?⓪.BCS     mvDone        ;muss Null sein⓪.BHI     mvLong        ;muss >= 4 sein⓪.MOVE.W  #$3123,(a4)+  ;move.w -(a3),-(a0) fuer den Rest⓪ mvDone        CLR.W   D7⓪ END⓪ END Put7;⓪ ⓪ PROCEDURE Put8;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$4EB9,(A4)+   ;jsr.l⓪)CLR.W   D7⓪&END⓪ END Put8;⓪ ⓪ PROCEDURE Put25;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W  #$26FC,(A4)+⓪)MOVE.L  D7,Peephole⓪)MOVE.L  #$003C0402,D7⓪ END⓪ END Put25;⓪ ⓪ (*⓪ PROCEDURE Put33;                (* move.l #[d0],d0  oder  moveq #[d0],d0 *)⓪ BEGIN ASSEMBLER⓪)CMPI.L  #127,D0⓪)BLS     Put3301⓪)CMPI.L  #-127,D0⓪)BCC     Put3301⓪)MOVE.W  #$203C,(A4)+⓪)MOVE.L  D0,(A4)+⓪)CLR.W   D7⓪)RTS⓪ put3301  ANDI.W  #$FF,D0⓪)ORI.W   #$7000,D0⓪)MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪&END⓪ END Put33;⓪ *)⓪ ⓪ PROCEDURE Put33w;                (* move.w #[d0],d0  oder  moveq #[d0],d0 *)⓪ BEGIN ASSEMBLER⓪)CMPI.W  #127,D0⓪)BLS     Put3301⓪)CMPI.W  #-127,D0⓪)BCC     Put3301⓪)MOVE.W  #$303C,(A4)+⓪)MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪)RTS⓪ put3301  ANDI.W  #$FF,D0⓪)ORI.W   #$7000,D0⓪)MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪&END⓪ END Put33w;⓪ ⓪ (*⓪ PROCEDURE Put38;⓪ BEGIN⓪ ASSEMBLER⓪$CMPI.B  #1,D7⓪)BEQ     Put3801⓪)CMPI.B  #3,D7⓪)BEQ     Put3802⓪)MOVE.L  #$4A636700,(A4)+       ; TST -(A3)    BEQ ...⓪)CLR.W   D7⓪)RTS⓪ put3801  LSR.W   #8,D7⓪)SUBA.W  D7,A4⓪)SWAP    D7⓪)EORI.W  #$6100,D7⓪)MOVE.W  D7,(A4)+⓪)CLR.W   D7⓪)RTS⓪ put3802  MOVE.W  #$3023,D0⓪)JSR     MOVECUT⓪)MOVE.W  #$6700,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put38;⓪ *)⓪ ⓪ PROCEDURE Put39;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6000,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put39;⓪ ⓪ (*⓪ PROCEDURE Put45;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$2F23,D0⓪)CMPI.B  #2,D7⓪)BNE     L1⓪)JMP     MOVECUT⓪)!L1 MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put45;⓪ *)⓪ PROCEDURE Put46;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6500,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put46;⓪ PROCEDURE Put47;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6200,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put47;⓪ PROCEDURE Put48;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6D00,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put48;⓪ PROCEDURE Put49;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6E00,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put49;⓪ PROCEDURE Put50;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$2F0C,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put50;⓪ (*⓪ PROCEDURE Put51;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$285F,(A4)+⓪)CLR.W   D7⓪)TST.L   D1⓪)BMI     Put5103⓪)CMPI.L  #8,D1⓪)BLS     Put5101       ;ADDQ⓪)MOVE.W  #$0694,(A4)+⓪)MOVE.L  D1,(A4)+      ;ADD.L⓪)RTS⓪ put5101  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5094,D1⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put5103  NEG.L   D1⓪)CMPI.L  #8,D1⓪)BLS     Put5102       ;SUBQ⓪)MOVE.W  #$0494,(A4)+⓪)MOVE.L  D1,(A4)+⓪)RTS⓪ put5102  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5194,D1⓪)MOVE.W  D1,(A4)+⓪ END⓪ END Put51;⓪ PROCEDURE Put52;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$588F,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put52;⓪ PROCEDURE Put53;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.L  #$2017B094,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put53;⓪ *)⓪ ⓪ PROCEDURE Put54;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$6100,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put54;⓪ ⓪ PROCEDURE Put55;⓪ BEGIN ASSEMBLER⓪); No valid RETURN⓪ (*$ ? Gepard:⓪)MOVE.W  #$4E41,(A4)+   *)⓪ (*$ ? Atari:⓪)MOVE.W  #$4E46,(A4)+⓪)MOVE    #-9,(A4)+       *)⓪)CLR.W   D7⓪&END⓪ END Put55;⓪ ⓪ PROCEDURE PutTRAPCaseErr;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$4E46,(A4)+⓪)MOVE    #-23,(A4)+⓪)CLR.W   D7⓪&END⓪ END PutTRAPCaseErr;⓪ ⓪ PROCEDURE Put56a;  (* schneller Stackspace-Check *)⓪ BEGIN ASSEMBLER⓪)MOVE.L  StackReserve,D1⓪)ADD.L   D0,D1⓪)CMPI.L  #$8000,D1⓪)BCS     lower⓪)MOVE.W  #$207C,(A4)+      ;move.l #xx,a0⓪)MOVE.L  D1,(A4)+⓪)MOVE.W  #$D1CB,(A4)+      ;adda.l a3,a0⓪)BRA     c1⓪'lower⓪)MOVE.W  #$41EB,(A4)+      ;lea xx(a3),a0       ; !tt 28.5.88⓪)MOVE.W  D1,(A4)+⓪'c1⓪)MOVE.W  #$B1CF,(A4)+      ; cmp.l a7,a0⓪ (*$ ? Gepard:⓪)MOVE.L  #$65024E44,(A4)+       *)⓪ (*$ ? Atari:⓪)MOVE.L  #$65044E46,(A4)+⓪)MOVE    #-10,(A4)+               *)⓪)CLR.W   D7⓪&END⓪ END Put56a;⓪ ⓪ PROCEDURE Put56b;  (* kurzer Stackspace-Check *)⓪ BEGIN ASSEMBLER⓪)MOVEM.L D1/D3,-(A7)⓪)MOVE.L  StackReserve,D1⓪)ADD.L   D0,D1⓪)CMPI.L  #$240,D0       ;max. 64 Bytes mehr auf Stack?⓪)BHI     varLink        ;nein -> variabler Link⓪)MOVEQ   #41,D3         ;ja -> JSR @STK1: immer $240-Check machen⓪)BRA     cont⓪ varLink  CMPI.L  #$8000,D0⓪)BCS     useMoveW⓪)MOVE    #$207C,(A4)+   ;MOVE.L #x,A0⓪)MOVE.L  D0,(A4)+⓪)BRA     call⓪ useMoveW MOVE    #$307C,(A4)+   ;MOVE.W #x,A0⓪)MOVE.W  D0,(A4)+⓪ call     MOVEQ   #42,D3         ;JSR @STK2⓪ cont     JSR     csp⓪)MOVEM.L (A7)+,D1/D3⓪ END⓪ END Put56b;⓪ ⓪ PROCEDURE Put66;        (* MOVE.L -(A3),D0 *)⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$2023,D0⓪$CMPI.B  #2,D7⓪$BNE     L1⓪$JMP     MOVECUT⓪ !L1 MOVE.W  D0,(A4)+⓪$MOVE.L  D7,Peephole⓪$MOVE.L  #$00230009,D7       ;Long Data -(A3) -> D0⓪ END⓪ END Put66;⓪ ⓪ PROCEDURE Put67;        (* MOVE.W -(A3),D0 *)⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$3023,D0⓪$CMPI.B  #3,D7⓪$BNE     L1⓪$JMP     MOVECUT⓪ !L1 MOVE.W  D0,(A4)+⓪$MOVE.L  D7,Peephole⓪$MOVE.L  #$0023000A,D7       ;Word Data -(A3) -> D0⓪ END⓪ END Put67;⓪ ⓪ PROCEDURE Put69;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$0480,(A4)+   ;sub.l #xx,d0⓪)CLR.W   D7⓪&END⓪ END Put69;⓪ ⓪ PROCEDURE Put70;⓪ BEGIN  ASSEMBLER⓪)MOVE.W  #$E348,(A4)+⓪)MOVE.L  #$303B0006,(A4)+⓪)MOVE.L  #$4EFB0002,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put70;⓪ ⓪ (*⓪ PROCEDURE Put72;  (* versuchsweise mit Kuerzung des vorletzten Befehls *)⓪ BEGIN⓪ ASSEMBLER⓪)TST.B   D7⓪)BEQ     nix            ;keine Information⓪)CMPI.B  #2,D7⓪)BNE     L1⓪)MOVE.W  #$2063,D0⓪)JMP     MOVECUT⓪ !L1      MOVE.L  Peephole,D0⓪)CMPI.B  #2,D0          ;voriger Befehl 'Long -> EvalStack' ?⓪)BNE     nix⓪)⓪); jetzt Situation vor dem letzten Befehl wiederherstellen⓪)⓪)MOVEM.L A4/D7,-(A7)    ;jetzigen Zustand retten⓪)LSR.W   #8,D7          ;Offset zum vorigen Befehl ermitteln⓪)NEG.W   D7⓪)LEA     -2(A4,D7.W),A4 ;das wird der vorgetaeuschte Code-Ptr⓪)MOVE.L  A4,-(A7)⓪)MOVE.L  Peephole,D7    ;alte Peephole-Situation erzeugen⓪)CLR.L   Peephole⓪)MOVE.W  #$2063,D0⓪)JSR     MoveCut⓪)CMPA.L  (A7)+,A4       ;hat MoveCut A4 veraendert?⓪)BEQ     noNop⓪)MOVE.W  #$4E71,(A4)    ;ja: weggekuerzten Befehl ueberNOPpen⓪ noNop    MOVEM.L (A7)+,D7/A4⓪)RTS⓪ nix      MOVE.W  #$2063,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put72;⓪ ⓪ PROCEDURE Put74;⓪"(*⓪%Korrektur von A3 bei StringAssign mit SourceLen < DestLen:⓪%A3 um [D1.L] erhoehen. Wird nur mit geradem D1 aufgerufen.⓪%In der Atari-Version muss zunaechst eine Endmarke 00.W⓪%erzeugt werden, falls der String auf dem Stack noch keine⓪%hat; der restliche Offset wird durch Addition auf A3 erreicht.⓪"*)⓪ BEGIN ASSEMBLER⓪)TST.L   D1⓪)BEQ     Put7401        ;Offset ist Null⓪ (*$ ? Atari:⓪)MOVE.W  #$425B,(A4)+   ;clr.w (a3)+⓪)SUBQ.L  #2,D1⓪)BEQ     Put7401        ;das war alles          *)⓪)CMPI.L  #$7FFF,D1⓪)BHI     LongOff        ;Offset passt nicht in ein Wort⓪)MOVE.W  #$D6FC,(A4)+   ;adda.w #data,a3⓪)MOVE.W  D1,(A4)+⓪)BRA     put7402⓪ LongOff  MOVE.W  #$D7FC,(A4)+   ;adda.l #data,a3⓪)MOVE.L  D1,(A4)+⓪ put7402  CLR.W   D7⓪ put7401⓪)END⓪ END Put74;⓪ *)⓪ ⓪ PROCEDURE PutDebug;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪)ANDI.W  #$F,D0⓪)ORI.W   #$4E40,D0⓪)MOVE.W  D0,(A4)+      ;TRAP #<D0>⓪)CLR.W   D7                             *)⓪ (*$ ? Atari:⓪)MOVE    #$4E45,(A4)+⓪)MOVE    D0,(A4)+⓪)CLR     D7                             *)⓪&END⓪ END PutDebug;⓪ ⓪ (*⓪ PROCEDURE Put77;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$6400,(A4)+⓪)CLR.W   D7⓪&END⓪ END Put77;⓪ ⓪ PROCEDURE Put78;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$6800,(A4)+   ; BVC⓪)CLR.W   D7⓪&END⓪ END Put78;⓪ *)⓪ ⓪ PROCEDURE Put79;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$0C40,(A4)+   ; CMPI.W⓪)CLR.W   D7⓪&END⓪ END Put79;⓪ ⓪ PROCEDURE Put79b;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$0C80,(A4)+   ; CMPI.L⓪)CLR.W   D7⓪&END⓪ END Put79b;⓪ ⓪ PROCEDURE Put80;⓪ BEGIN ASSEMBLER⓪); SUBI.W #_,D0⓪)MOVE.W  #$0440,(A4)+⓪)CLR.W   D7⓪&END⓪ END Put80;⓪ ⓪ PROCEDURE PutSubIW_D0; (* SUB.W #<D0>,D0 *)⓪"BEGIN⓪$ASSEMBLER⓪)TST.W   D0⓪)BEQ     nothing⓪)CMPI.W  #8,D0⓪)BLS     quick⓪)JSR     Put80⓪)MOVE.W  D0,(A4)+⓪)RTS⓪'quick⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$5140,D0        ;SUBQ.W #<D0>,D0⓪)MOVE.W  D0,(A4)+⓪'nothing⓪)CLR.W   D7⓪$END⓪"END PutSubIW_D0;⓪ ⓪ PROCEDURE PutSubIL_D0; (* SUB.L #<D0>,D0 *)⓪"BEGIN⓪$ASSEMBLER⓪)TST.L   D0⓪)BEQ     nothing⓪)CMPI.L  #8,D0⓪)BLS     quick⓪)JSR     Put69⓪)MOVE.L  D0,(A4)+⓪)RTS⓪'quick⓪)ANDI.W  #7,D0⓪)LSL.W   #8,D0⓪)LSL.W   #1,D0⓪)ORI.W   #$5180,D0        ;SUBQ.L #<D0>,D0⓪)MOVE.W  D0,(A4)+⓪'nothing⓪)CLR.W   D7⓪$END⓪"END PutSubIL_D0;⓪"⓪ (*⓪ PROCEDURE Put81;        (* WITH-Kopf *)⓪ BEGIN ASSEMBLER⓪.MOVE.W  #$2F23,D0      ;move.l -(a3),-(a7)⓪.CMPI.B  #2,D7⓪.BNE     Put8101⓪.JSR     MOVECUT⓪.BRA     Put8102⓪ put8101       MOVE.W  D0,(A4)+⓪ put8102⓪ (*$ ? Gepard: MOVE.L  #$2F0A244F,(A4)+ ;move.l a2,-(a7); move.l a7,a2 *)⓪ (*$ ? Atari:  MOVE.L  #$2F0E2C4F,(A4)+ ;move.l a6,-(a7); move.l a7,a6 *)⓪.CLR.W   D7⓪&END⓪ END Put81;⓪ ⓪ PROCEDURE Put82;        (* WITH-Ende *)⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: MOVE.L  #$245F588F,(A4)+  ;move.l (a7)+,a2; addq.l #4,a7 *)⓪ (*$ ? Atari:  MOVE.L  #$2C5F588F,(A4)+  ;move.l (a7)+,a6; addq.l #4,a7 *)⓪.CLR.W   D7⓪&END⓪ END Put82;⓪ ⓪ PROCEDURE Put85;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$3F23,D0      ;move.w -(a3),-(a7)⓪)CMPI.B  #3,D7⓪)BNE     L1⓪)JMP     MOVECUT⓪)!L1 MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪%END⓪ END Put85;⓪ ⓪ PROCEDURE Put86;⓪ BEGIN ASSEMBLER⓪)MOVE.L  #$3017B054,(A4)+⓪)CLR.W   D7⓪&END⓪ END Put86;⓪ ⓪ PROCEDURE Put87;⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$285F,(A4)+⓪)CLR.W   D7⓪)TST.W   D1⓪)BMI     Put8703⓪)CMPI.W  #8,D1⓪)BLS     Put8701       ;ADDQ⓪)MOVE.W  #$0654,(A4)+⓪)MOVE.W  D1,(A4)+      ;ADD.W⓪)RTS⓪ put8701  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5054,D1⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put8703  NEG.W   D1⓪)CMPI.W  #8,D1⓪)BLS     Put8702       ;SUBQ⓪)MOVE.W  #$0454,(A4)+⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put8702  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5154,D1⓪)MOVE.W  D1,(A4)+⓪ END⓪ END Put87;⓪ ⓪ PROCEDURE Put88;⓪ BEGIN⓪ ASSEMBLER⓪$MOVE.W  #$548F,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put88;⓪ ⓪ PROCEDURE Put106;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$5250,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put106;⓪ PROCEDURE Put107;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$5290,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put107;⓪ PROCEDURE Put108;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$D150,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put108;⓪ PROCEDURE Put109;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$D190,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put109;⓪ PROCEDURE Put110;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$5350,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put110;⓪ PROCEDURE Put111;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$5390,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put111;⓪ PROCEDURE Put112;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$9150,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put112;⓪ PROCEDURE Put113;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$9190,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put113;⓪ PROCEDURE Put114;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$4280,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put114;⓪ *)⓪ ⓪ PROCEDURE Put118;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$DEFC,(A4)+⓪)CLR.W   D7⓪ END⓪ END Put118;⓪ ⓪ (*⓪ PROCEDURE Put126;⓪ BEGIN⓪ ASSEMBLER⓪#JSR     Put67⓪$MOVE.W  #$48C0,(A4)+⓪$CLR.W   D7⓪ END⓪ END Put126;⓪ *)⓪ ⓪ PROCEDURE Put128;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W  #$36C0,(A4)+⓪$MOVE.L  D7,Peephole⓪$MOVEQ   #3,D7⓪ END⓪ END Put128;⓪ ⓪ (*⓪ PROCEDURE Put142;⓪ BEGIN⓪ ASSEMBLER⓪)CLR.W   D7⓪)SUBQ.W  #1,D0⓪)BCS     Put1421         ;LOKAL⓪)BEQ     Put1422         ;GLEICHE EBENE⓪ ⓪ (*$ ? Gepard:⓪)MOVE.W  #$2052,(A4)+    ;move.l (a2),a0⓪ put1423  SUBQ.W  #1,D0⓪)BEQ     Put1424⓪)MOVE.W  #$2050,(A4)+    ;move.l (a0),a0⓪)BRA     Put1423⓪ put1424  MOVE.W  #$2410,(A4)+    ;move.l (a0),d2⓪)RTS⓪ put1421  MOVE.W  #$240A,(A4)+    ;move.l a2,d2⓪)RTS⓪ put1422  MOVE.W  #$2412,(A4)+    ;move.l (a2),d2 *)⓪ ⓪ (*$ ? Atari:⓪)MOVE.W  #$2056,(A4)+    ;move.l (a6),a0⓪ put1423  SUBQ.W  #1,D0⓪)BEQ     Put1424⓪)MOVE.W  #$2050,(A4)+    ;move.l (a0),a0⓪)BRA     Put1423⓪ put1424  MOVE.W  #$2410,(A4)+    ;move.l (a0),d2⓪)RTS⓪ put1421  MOVE.W  #$240E,(A4)+    ;move.l a6,d2⓪)RTS⓪ put1422  MOVE.W  #$2416,(A4)+    ;move.l (a6),d2 *)⓪ ⓪&END⓪ END Put142;⓪ *)⓪ ⓪ PROCEDURE Put146;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(MOVE.W   #$40E7,(A4)+  ;MOVE SR,-(A7)⓪(MOVE.W   #$007C,(A4)+  ;ORI #data,SR⓪(MOVE.W   #$0700,(A4)+  ;erst mal hoechste Prioritaet setzen⓪(MOVE.W   #$027C,(A4)+  ;ANDI #data,SR⓪(AND.W    #7,D0         ;D0 enthaelt das Interrupt-Level⓪(LSL.W    #8,D0⓪(OR.W     #$F8FF,D0     ;alle anderen Bits leben lassen⓪(MOVE.W   D0,(A4)+⓪ *)⓪ (*$ ? Atari:⓪(MOVE.W   #$40E7,(A4)+  ;MOVE SR,-(A7)⓪(AND.W    #7,D0         ;D0 enthaelt das Interrupt-Level⓪(LSL.W    #8,D0⓪(MOVE.W   #$323C,(A4)+  ;MOVE.W #x,D1⓪(MOVE.W   D0,(A4)+⓪(MOVEQ    #36,D3        ;JSR @PRIO⓪(JSR      csp⓪ *)⓪(CLR.W    D7⓪&END⓪ END Put146;⓪ ⓪ (*⓪ PROCEDURE Put147;   (* Konfigurations-Dummy, bei $K+ am ModulRumpf-Anfang *)⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L  #$60000004,(A4)+ ;bra.l +4⓪)MOVE.W  #$4E75,(A4)+     ;rts⓪)CLR.L   D7⓪ END⓪ END Put147;⓪ *)⓪ ⓪ PROCEDURE Put151;  (* Restore A2/A6 bei EXIT aus WITH *)⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard: MOVE.W  #$246F,(A4)+     ;movea.w [d0] (a7),a2 *)⓪ (*$ ? Atari:  MOVE.W  #$2C6F,(A4)+     ;movea.w [d0] (a7),a6 *)⓪.MOVE.W  D0,(A4)+⓪.CLR.W   D7⓪&END⓪ END Put151;⓪ ⓪ PROCEDURE Put203;   (* Expand Byte to Word *)⓪ BEGIN ASSEMBLER⓪)JSR     put216           ;pull byte -> D0⓪)MOVE.L  #$024000FF,(A4)+ ;andi.w #$ff,d0⓪)CLR.W   D7⓪)JMP     put128           ;move.w d0,(a3)+⓪&END⓪ END Put203;⓪ ⓪ (*⓪ PROCEDURE Put205;   (* Inc (Byte) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W  #$5210,(A4)+    ;addq.b #1,(a0)⓪(CLR.W   D7⓪&END⓪ END Put205;⓪ ⓪ PROCEDURE Put206;   (* Dec (Byte) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W  #$5310,(A4)+    ;subq.b #1,(a0)⓪(CLR.W   D7⓪&END⓪ END Put206;⓪ ⓪ PROCEDURE Put207;   (* Inc (Byte, x) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W  #$D110,(A4)+    ;add.b d0,(a0)⓪(CLR.W   D7⓪&END⓪ END Put207;⓪ ⓪ PROCEDURE Put208;   (* Dec (Byte, x) *)⓪ BEGIN ASSEMBLER⓪(MOVE.W  #$9110,(A4)+    ;sub.b d0,(a0)⓪(CLR.W   D7⓪&END⓪ END Put208;⓪ ⓪ PROCEDURE Put210;   (* FOR-LaufVar inkr/dekr. (Bytes) *)⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$285F,(A4)+  ;move.l (a7)+,a4⓪)CLR.W   D7⓪)TST.W   D1⓪)BMI     Put8703       ;Step ist negativ: SUBs erzeugen⓪)CMPI.W  #8,D1⓪)BLS     Put8701       ;addq tut's auch ->⓪)MOVE.W  #$0614,(A4)+  ;add.b [d1],(a4)⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put8701  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5014,D1     ;addq.b #[d1],(a4) wird gebastelt⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put8703  NEG.W   D1⓪)CMPI.W  #8,D1⓪)BLS     Put8702       ;subq tut's auch ->⓪)MOVE.W  #$0414,(A4)+  ;sub.b [d1],(a4)⓪)MOVE.W  D1,(A4)+⓪)RTS⓪ put8702  ANDI.W  #7,D1⓪)LSL.W   #8,D1⓪)LSL.W   #1,D1⓪)ORI.W   #$5114,D1     ;subq.b #[d1],(a4) wird gebastelt⓪)MOVE.W  D1,(A4)+⓪&END⓪ END Put210;⓪ ⓪ PROCEDURE Put213;   (* FOR-LaufVar mit Obergrenze vergleichen *)⓪ BEGIN ASSEMBLER⓪)MOVE.L  #$3017B014,(A4)+  ;move.w (a7),d0 ;  cmp.b (a4),d0⓪)CLR.W   D7⓪&END⓪ END Put213;⓪ *)⓪ ⓪ PROCEDURE put216;       (* Pull Byte -(A3) -> D0 *)⓪ BEGIN ASSEMBLER⓪)MOVE.W  #$1023,D0      ;move.b -(a3),d0⓪)CMP.B   #12,D7         ;war move.b source,(a3)+ ?⓪)BNE     put4201⓪)JSR     MoveCut⓪)SUBQ.L  #2,A4          ;clr.b (a3)+ loeschen⓪)RTS⓪ put4201  MOVE.W  #$538B,(A4)+   ;subq.l #1,a3⓪)MOVE.W  D0,(A4)+⓪)CLR.W   D7⓪&END⓪ END put216;⓪ ⓪ PROCEDURE STPROC;⓪"BEGIN⓪$ASSEMBLER⓪)ACZ     '@LREQ'        ; 0⓪)ACZ     '@LRNE'⓪)ACZ     '@LRLE'⓪)ACZ     '@LRGE'⓪)ACZ     '@LRLT'⓪)ACZ     '@LRGT'⓪)ACZ     '@LNEG'⓪)ACZ     '@LADD'        ; 7⓪)ACZ     '@LSUB'        ; 8⓪)ACZ     '@IMUL'⓪)ACZ     '@CMUL'⓪)ACZ     '@LMUL'        ; 11⓪)ACZ     '@IDIV'⓪)ACZ     '@CDIV'⓪)ACZ     '@LDIV'        ; 14⓪)ACZ     '@IMOD'⓪)ACZ     '@CMOD'⓪)ACZ     '@STAS'⓪)ACZ     '@FNUL'        ; 18⓪)ACZ     '@ICHK'⓪)ACZ     '@CCHK'        ; 20⓪)ACZ     '@WCHK'⓪)ACZ     '@INCL'        ; 22⓪)ACZ     '@EXCL'⓪)ACZ     '@STOL'        ; 24⓪)ACZ     '@LTOS'⓪)ACZ     '@FOPS'        ; 26⓪)ACZ     '@FOPD'        ; 27⓪)ACZ     '@SMEM'⓪)ACZ     '@SEQL'⓪)ACZ     '@SNEQ'        ; 30⓪)ACZ     '@SLEQ'⓪)ACZ     '@SGEQ'⓪)ACZ     '@TRAN'⓪)ACZ     '@IOTR'⓪)ACZ     '@NEWP'⓪)ACZ     '@PRIO'⓪)ACZ     '@COPY'        ;Open Array umkopieren⓪)ACZ     '@COPS'        ;Open Array umkopieren, dabei TOS.L retten⓪)ACZ     '@LSTN'⓪)ACZ     '@IOCA'        ; 40⓪)ACZ     '@STK1'        ;Entry-Code f. Prozeduren, mit 0-Link⓪)ACZ     '@STK2'        ;Entry-Code f. Prozeduren⓪)ACZ     '@RES1'⓪)ACZ     '@RES2'⓪)ACZ     '@RES3'⓪)ACZ     '@RES4'⓪)ACZ     '@RES5'⓪)ACZ     '@RES6'⓪)ACZ     '@RES7'⓪)ACZ     '@IMLW'        ; 50⓪)ACZ     '@CMLW'⓪)ACZ     '@IDVW'⓪)ACZ     '@CDVW'⓪)ACZ     '@IMDW'⓪)ACZ     '@CMDW'⓪)ACZ     '@IMLL'        ; 56⓪)ACZ     '@CMLL'⓪)ACZ     '@IDVL'⓪)ACZ     '@CDVL'⓪)ACZ     '@IMDL'⓪)ACZ     '@CMDL'⓪)ACZ     '@PS3B'        ; 62⓪)ACZ     '@PS3W'⓪)ACZ     '@PS3L'⓪)ACZ     '@PS7B'⓪)ACZ     '@PS7W'⓪)ACZ     '@PS7L'⓪)ACZ     '@COPW'        ; 68⓪)ACZ     '@COPL'        ; 69⓪)ACZ     '@CAP' DC.B 0  ; 70⓪)ACZ     '@LENW'        ; 71⓪)ACZ     '@LENL'        ; 72⓪)ACZ     '@SAND'        ; 73⓪)ACZ     '@SXOR'⓪)ACZ     '@SSUM'⓪)ACZ     '@SDIF'⓪)ACZ     '@SAN1'        ; 77⓪)ACZ     '@SXO1'⓪)ACZ     '@SSU1'⓪)ACZ     '@SDI1'⓪)ACZ     '@SAN2'        ; 81⓪)ACZ     '@SXO2'⓪)ACZ     '@SSU2'⓪)ACZ     '@SDI2'        ; 84⓪)ACZ     '@FMVS'        ; 85⓪)ACZ     '@FMVD'        ; 86⓪)ACZ     '@FCPN'        ; 87⓪)ACZ     '@FCPS'        ; 88⓪)ACZ     '@FCPD'        ; 89⓪)ACZ     '@VFPU'        ; 90⓪)ACZ     '@LABS'        ; 91⓪)ACZ     '@SNEG'        ; 92⓪)ACZ     '@SABS'        ; 93⓪)ACZ     '@SADD'⓪)ACZ     '@SSUB'⓪)ACZ     '@SMUL'⓪)ACZ     '@SDIV'⓪)ACZ     '@SRLE'⓪)ACZ     '@SRGE'⓪)ACZ     '@SRLT'⓪)ACZ     '@SRGT'        ; 101⓪)ACZ     '@LC2S'        ; 102⓪)ACZ     '@LI2S'        ; 103⓪)ACZ     '@LC2D'        ; 104⓪)ACZ     '@LI2D'        ; 105⓪)ACZ     '@S2LC'        ; 106⓪)ACZ     '@S2LI'        ; 107⓪)ACZ     '@D2LC'        ; 108⓪)ACZ     '@D2LI'        ; 109⓪)ACZ     '@SIRG'        ; 110⓪)ACZ     '@CWOP'        ; 111⓪)ACZ     '@CLOP'        ; 112⓪)ACZ     '@FP7S'        ; 113⓪)ACZ     '@FP7D'        ; 114⓪)ACZ     '@FP3S'        ; 115⓪)ACZ     '@FP3D'        ; 116⓪)ACZ     '@FG7S'        ; 117⓪)ACZ     '@FG7D'        ; 118⓪)ACZ     '@FG3S'        ; 119⓪)ACZ     '@FG3D'        ; 120⓪)ACZ     '@FP7M'        ; 121⓪)ACZ     '@FG7M'        ; 122⓪)ACZ     '@ROTA'        ; 123⓪)ACZ     '@SHFT'        ; 124⓪ ⓪$END⓪"END STPROC;⓪ ⓪ FORWARD CSP1;⓪ PROCEDURE CSP;⓪ BEGIN⓪ ASSEMBLER  MULU    #6,D3⓪)LEA     STPROC,A0⓪)ADDA.L  D3,A0⓪)JMP     CSP1⓪ END⓪ END CSP;⓪ ⓪ PROCEDURE CSP1;⓪ BEGIN ASSEMBLER⓪)MOVE.L  A0,-(A7)⓪)JSR     SearchID⓪)MOVE.L  (A7)+,A0⓪)CMPI.B  #6,D3         ;PROC?⓪)BEQ     OK1⓪)⓪)MOVE.L  A0,A2⓪)LEA     BadId,A0⓪)MOVEQ   #0,D0          ; optional Term-Char⓪)MOVEQ   #40,D2         ; max. Length⓪)JSR     FetchString⓪)MOVE    #rNoRun,D5    ;NOT AVAILABLE⓪)JMP     SyntaxErr⓪!⓪!!OK1    JSR     Put8          ;JSR.L⓪)MOVE.L  A4,D0⓪)SUB.L   CodeStart,D0       ;REL ^REFERENZ⓪)MOVE.L  -18(A1,D2.L),(A4)+ ;Put RELOC LINK⓪)MOVE.L  D0,-18(A1,D2.L)    ;NEUER LINK⓪ END⓪ END CSP1;⓪)⓪ PROCEDURE ALLOC;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(ACZ     'Allocate'      *)⓪ (*$ ? Atari:⓪(ACZ     'ALLOCATE'      *)⓪(SYNC⓪&END⓪ END ALLOC;⓪ ⓪ PROCEDURE DEALL;⓪ BEGIN ASSEMBLER⓪ (*$ ? Gepard:⓪(ACZ     'DeAllocate'    *)⓪ (*$ ? Atari:⓪(ACZ     'DEALLOCATE'    *)⓪(SYNC⓪&END⓪ END DEALL;⓪ ⓪ PROCEDURE CALLAL;⓪ BEGIN ASSEMBLER⓪)LEA     ALLOC,A0⓪)JMP     CSP1⓪&END⓪ END CALLAL;⓪ ⓪ PROCEDURE CALLDEAL;⓪ BEGIN  ASSEMBLER⓪)LEA     DEALL,A0⓪)JMP     CSP1⓪'END⓪ END CALLDEAL;⓪ ə
  2. (* $FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158Ç$00008AF1T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFED5158$00008FF1$00008AF1$00008B1E$00008B2C$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158$FFED5158öÇâ*)
  3.